package br.com.ro.view;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

import br.com.ro.model.dao.GrupoDao;
import br.com.ro.model.dao.PerfilDao;
import br.com.ro.model.dao.UsuarioDao;
import br.com.ro.model.entity.Grupo;
import br.com.ro.model.entity.Perfil;
import br.com.ro.model.entity.Usuario;
import br.com.ro.util.BeanFactory;
import br.com.ro.util.Utils;

@ManagedBean(name = "usuarioBean")
@ViewScoped
public class UsuarioBean implements Serializable {

	private static final long serialVersionUID = 1L;
	private Usuario usuario = new Usuario();
	private List<Usuario> listaUsuarios = new ArrayList<Usuario>();
	private UsuarioDao usuarioDao = (UsuarioDao) BeanFactory.getBean("usuarioDao", UsuarioDao.class);

	private GrupoDao gDao = (GrupoDao) BeanFactory.getBean("grupoDao", GrupoDao.class);

	private PerfilDao pDao = (PerfilDao) BeanFactory.getBean("perfilDao", PerfilDao.class);

	private Integer idGrupo;
	private Integer idPerfil;

	private List<SelectItem> listaGrupo = null;
	private List<SelectItem> listaPerfil = null;

	public UsuarioBean() {
		atualizarTela();
		carregarListas();
	}

	private void carregarListas() {
		listaGrupo = new ArrayList<SelectItem>();
		listaPerfil = new ArrayList<SelectItem>();
		for (Grupo grupo : gDao.listAll()) {
			listaGrupo.add(new SelectItem(grupo.getId(), grupo.getDescricao()));
		}

		for (Perfil perfil : pDao.listAll()) {
			listaPerfil.add(new SelectItem(perfil.getId(), perfil.getDescricao()));
		}
	}

	public String login() {
		List<Usuario> u = usuarioDao.findBySQL("FROM Usuario WHERE login = '" + usuario.getLogin() + "' and password = '" + usuario.getPassword()
				+ "'");
		if (u.size() > 0) {
			FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("ID_USUARIO", u.get(0).getId());
		} else {
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("usuario e /ou senha invalida"));
			return "login";
		}
		return "home";
	}

	public String logout() {
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().remove("ID_USUARIO");
		return "login";
	}

	/**
	 * Limpa os campos input e atualiza a lista de usuarios cadastrados
	 */
	private void atualizarTela() {
		usuario = new Usuario();
		idGrupo = null;
		idPerfil = null;
		listaUsuarios = usuarioDao.listAll();
	}

	public void limpar() {
		usuario = new Usuario();
		idGrupo = null;
		idPerfil = null;

	}

	/**
	 * Grava novo registro ou atualiza um registro
	 */
	public void gravar() {

		Object[] obj = { idGrupo, "O Grupo", idPerfil, "O perfil", getUsuario().getNome(), "O nome", getUsuario().getLogin(), "O login",
				getUsuario().getPassword(), "O password" };
		if (Utils.getValilador().validar(obj))
			return;

		getUsuario().setGrupoId(new Grupo(idGrupo));
		getUsuario().setPerfilId(new Perfil(idPerfil));
		usuarioDao.save(getUsuario());
		atualizarTela();
	}

	/**
	 * Exclui um registro da tabela usuario
	 */
	public void excluir() {
		usuarioDao.delete(getUsuario());
		atualizarTela();
	}

	public List<Usuario> getListaUsuarios() {
		return listaUsuarios;
	}

	public void setListaUsuarios(List<Usuario> listaUsuarios) {
		this.listaUsuarios = listaUsuarios;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		idGrupo = usuario.getGrupoId().getId();
		idPerfil = usuario.getPerfilId().getId();
		this.usuario = usuario;
	}

	public List<SelectItem> getListaGrupo() {
		return listaGrupo;
	}

	public void setListaGrupo(List<SelectItem> listaGrupo) {
		this.listaGrupo = listaGrupo;
	}

	public List<SelectItem> getListaPerfil() {
		return listaPerfil;
	}

	public void setListaPerfil(List<SelectItem> listaPerfil) {
		this.listaPerfil = listaPerfil;
	}

	public Integer getIdGrupo() {
		return idGrupo;
	}

	public void setIdGrupo(Integer idGrupo) {
		this.idGrupo = idGrupo;
	}

	public Integer getIdPerfil() {
		return idPerfil;
	}

	public void setIdPerfil(Integer idPerfil) {
		this.idPerfil = idPerfil;
	}

}
